package com.ldu.houserent.controller.front;

import com.ldu.houserent.common.base.BaseController;
import com.ldu.houserent.common.constant.Constant;
import com.ldu.houserent.common.dto.JsonResult;
import com.ldu.houserent.common.enums.HouseStatusEnum;
import com.ldu.houserent.common.enums.OrderStatusEnum;
import com.ldu.houserent.common.util.DateUtil;
import com.ldu.houserent.common.util.MailUtil;
import com.ldu.houserent.entity.House;
import com.ldu.houserent.entity.Order;
import com.ldu.houserent.entity.User;
import com.ldu.houserent.service.HouseService;
import com.ldu.houserent.service.OrderService;
import com.ldu.houserent.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.mail.MessagingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

/**
 * 前端订单控制器
 */
@Controller("frontOrderController")
public class OrderController extends BaseController {

    @Autowired
    private OrderService orderService;
    @Autowired
    private HouseService houseService;
    @Autowired
    private UserService userService;

    /*
        创建订单
     */
    @RequestMapping("/order/create")
    @ResponseBody
    public JsonResult createOrder(@RequestParam("houseId")Long houseId,@RequestParam("endDate")String endDateStr){
        //判断用户是否已经登录
        if(getLoginUser()==null){
            return JsonResult.error("用户未登录");
        }
        //判断房屋是否存在
        House house=houseService.get(houseId);
        if (house==null){
            return JsonResult.error("房屋不存在");
        }
        //判断房屋状态，已租出时不允许再新建订单
        if (Objects.equals(house.getStatus(), HouseStatusEnum.HAS_RENT.getValue())){
            return JsonResult.error("房屋已租出或未释放");
        }
        //判断订单状态，处于0生效中时，不允许再新建订单
        Order checkOrder=orderService.getCurrentEffectiveOrder(houseId);    //根据房屋的id查询该房屋是否存在生效中的订单
        if (checkOrder!=null){      //查询到了处于生效中的订单
            return JsonResult.error("房屋已租出或未释放");
        }
        //判断房屋是否有房东     //该判断可以删掉，如果没有房东，那么这个房屋理论上就不能被添加
        User ownerUser=userService.get(house.getUserId());
        if (ownerUser==null){
            return JsonResult.error("房东用户不存在");
        }

        //处理退租日期，需要将传过来的字符串转换成日期格式
        SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy");
        Date endDate;       //在try外边定义Date，以便于后面set该变量
        try {
            endDate=sdf.parse(endDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return JsonResult.error("退租日期格式不正确");
        }
        //判断开始日期是否早于结束日期一周，因为最短租住日期是一周
        Date startDate=new Date();      //获取当前时间
        //计算总共多少天
        Integer dayNum = DateUtil.daysBetween(startDate,endDate);
        if (dayNum< Constant.MIN_RENT_DAYS){
            return JsonResult.error("租住时间不得小于"+Constant.MIN_RENT_DAYS+"天");
        }

        //创建订单
        Order order=new Order();
        order.setCreateTime(new Date());                //创建时间为当前时间
        order.setCustomerUserId(getLoginUserId());      //租客用户id为当前登录的用户id
        order.setOwnerUserId(house.getUserId());        //房东用户id为房屋对应的用户id
        order.setHouseId(houseId);
        order.setStatus(OrderStatusEnum.NOT_AGREEMENT.getValue());
        order.setMonthRent(house.getMonthRent());
        order.setDayNum(dayNum);
        order.setTotalAmount(house.getMonthRent()/30*dayNum);   //租住总金额
        order.setStartDate(startDate);
        order.setEndDate(endDate);
        orderService.insert(order);     //新增订单
        return JsonResult.success("订单创建成功，请签订租赁合同",order.getId());      //将订单的id传到前端
    }//createOrder


    /*
        查看合同信息
     */
    @RequestMapping("/order/agreement/view")
    public String agreementView(@RequestParam(value = "orderId")Long orderId, Model model){
        if (getLoginUser()==null){              //未登录状态
            return "redirect:/";
        }
        //订单不存在的情况
        Order order=orderService.get(orderId);      //查询订单
        if (order==null){
            return renderNotFound();
        }
        //如果登录用户表示该订单的租客、房东或者管理员，则就不能查看合同
        if (!Objects.equals(getLoginUserId(),order.getCustomerUserId()) && !Objects.equals(getLoginUserId(),order.getOwnerUserId()) && !loginUserIsAdmin()){
            return renderNotAllowAccess();
        }
        //该订单的房屋信息，根据订单中房屋的id，将房屋信息设置到订单中
        order.setHouse(houseService.get(order.getHouseId()));
        //该订单的租客信息
        order.setCustomerUser(userService.get(order.getCustomerUserId()));
        //该订单的房东信息
        order.setOwnerUser(userService.get(order.getOwnerUserId()));
        model.addAttribute("order",order);
        return "front/agreement";       //返回前端页面agreement
    }//agreementView


    /*
       签订合同
     */
    @RequestMapping("/order/agreement/submit")
    @ResponseBody
    public JsonResult agreementSubmit(@RequestParam(value = "orderId")Long orderId, Model model){
        if (getLoginUser()==null){              //未登录状态
            return JsonResult.error("用户未登录");
        }
        //订单不存在的情况
        Order order=orderService.get(orderId);      //查询订单
        if (order==null){
            return JsonResult.error("订单不存在");
        }
        //如果登录用户表示该订单的租客、房东或者管理员，则就不能查看合同
        if (!Objects.equals(getLoginUserId(),order.getCustomerUserId()) && !Objects.equals(getLoginUserId(),order.getOwnerUserId()) && !loginUserIsAdmin()){
            return JsonResult.error("您没有权限查看并签订合同");
        }

        //判断房屋是否存在
        House house=houseService.get(order.getHouseId());
        if (house==null){
            return JsonResult.error("房屋不存在");
        }
        //判断房屋状态，已租出时不允许再新建订单
        if (Objects.equals(house.getStatus(), HouseStatusEnum.HAS_RENT.getValue())){
            return JsonResult.error("房屋已租出或未释放");
        }
        //判断订单状态，处于0生效中时，不允许再新建订单
        Order checkOrder=orderService.getCurrentEffectiveOrder(order.getHouseId());
        if (checkOrder!=null){      //查询到了处于生效中的订单
            return JsonResult.error("房屋已租出或未释放");
        }
        //判断房屋是否有房东     //该判断可以删掉，如果没有房东，那么这个房屋理论上就不能被添加
        User ownerUser=userService.get(house.getUserId());
        if (ownerUser==null){
            return JsonResult.error("房东用户不存在");
        }

        order.setStatus(OrderStatusEnum.NOT_PAY.getValue());        //签订合同后，修改订单状态未未付款
        orderService.update(order);
        return JsonResult.success("合同签订成功，请支付该订单",orderId);
    }//agreementSubmit

    /*
        转向支付页面
     */
    @RequestMapping("/order/pay")
    public String pay(@RequestParam(value = "orderId")Long orderId, Model model){
        if (getLoginUser()==null){              //未登录状态
            return "redirect:/";
        }
        //订单不存在的情况
        Order order=orderService.get(orderId);      //查询订单
        if (order==null){
            return renderNotFound();
        }
        //如果登录用户表示该订单的租客、房东或者管理员，则就不能查看订单
        if (!Objects.equals(getLoginUserId(),order.getCustomerUserId()) && !Objects.equals(getLoginUserId(),order.getOwnerUserId()) && !loginUserIsAdmin()){
            return renderNotAllowAccess();
        }
        //判断房屋是否存在
        House house=houseService.get(order.getHouseId());
        if (house==null){
            return renderNotAllowAccess();
        }
        //该订单的房屋信息，根据订单中房屋的id，将房屋信息设置到订单中
        order.setHouse(houseService.get(order.getHouseId()));
        model.addAttribute("order",order);
        return "front/pay";       //返回前端页面pay
    }//pay

    /*
       模拟支付
     */
    @RequestMapping("/order/pay/submit")
    @ResponseBody
    public JsonResult paySubmit(@RequestParam(value = "orderId")Long orderId){
        if (getLoginUser()==null){              //未登录状态
            return JsonResult.error("用户未登录");
        }
        //订单不存在的情况
        Order order=orderService.get(orderId);      //查询订单
        if (order==null){
            return JsonResult.error("订单不存在");
        }
        //如果登录用户表示该订单的租客、房东或者管理员，则就不能模拟支付
        if (!Objects.equals(getLoginUserId(),order.getCustomerUserId()) && !Objects.equals(getLoginUserId(),order.getOwnerUserId()) && !loginUserIsAdmin()){
            return JsonResult.error("您没有权限进行该合同的支付");
        }

        //判断房屋是否存在
        House house=houseService.get(order.getHouseId());
        if (house==null){
            return JsonResult.error("房屋不存在");
        }
        //判断房屋状态，已租出时不允许再新建订单
        if (Objects.equals(house.getStatus(), HouseStatusEnum.HAS_RENT.getValue())){
            return JsonResult.error("房屋已租出或未释放");
        }
        //判断订单状态，处于0生效中时，不允许再新建订单
        Order checkOrder=orderService.getCurrentEffectiveOrder(order.getHouseId());     //通过房屋id查询订单，看看该房屋是否已存在生效中的订单
        if (checkOrder!=null){      //查询到了处于生效中的订单
            return JsonResult.error("房屋已租出或未释放");
        }
        //判断房屋是否有房东     //该判断可以删掉，如果没有房东，那么这个房屋理论上就不能被添加
        User ownerUser=userService.get(house.getUserId());
        if (ownerUser==null){
            return JsonResult.error("房东用户不存在");
        }
        //更新订单的状态
        order.setStatus(OrderStatusEnum.NORMAL.getValue());        //完成支付后，修改订单状态为生效中（已租出）
        orderService.update(order);
        //更新房屋的状态和开始结束时间
        house.setStatus(HouseStatusEnum.HAS_RENT.getValue());       //房屋状态为已租出
        house.setLastOrderStartTime(order.getStartDate());
        house.setLastOrderEndTime(order.getEndDate());
        houseService.update(house);
        return JsonResult.success("支付成功，祝您入住愉快");
    }//paySubmit

    /*
        联系房东
     */
    @RequestMapping("/house/contact")
    @ResponseBody
    public JsonResult contact(@RequestParam("houseId")Long houseId,@RequestParam("name")String name,
                              @RequestParam("phone")String phone,@RequestParam("email")String email,
                              @RequestParam("content")String content){
                                //有entity的话，可以直接获取对象。没有对应的entity层，可以用@RequestParam来获取
        if (getLoginUser()==null){              //未登录状态
            return JsonResult.error("用户未登录");
        }
        //判断房屋是否存在
        House house=houseService.get(houseId);
        if (house==null){
            return JsonResult.error("房屋不存在");
        }
        User owner=userService.get(house.getUserId());
        if (owner==null){
            return JsonResult.error("房东不存在");
        }
        StringBuilder sb = new StringBuilder();     //将文字内容组合在一起用StringBuilder
        sb.append("姓名：").append(name).append("<br/>");
        sb.append("手机号：").append(phone).append("<br/>");
        sb.append("邮箱：").append(email).append("<br/>");
        sb.append("内容如下：").append(content).append("<br/>");
        sb.append("房屋链接（复制到地址栏打开）：").append("http://localhost:8080/house/detail/").append(houseId);
        try {
            MailUtil.sendEmail(owner.getEmail(),"来自"+name+"租房的咨询",sb.toString());
        } catch (MessagingException e) {
            e.printStackTrace();
            return JsonResult.error("邮件发送失败");
        }
        return JsonResult.success("邮件发送成功");

    }


}
